package com.quyunshuo.module.home.activity.stat

import android.util.Log
import com.quyunshuo.edwinpro.base.mvvm.m.BaseRepository
import com.quyunshuo.edwinpro.network.bean.ArticleListRes2
import com.quyunshuo.edwinpro.network.HomeApiService
import com.quyunshuo.edwinpro.network.bean.BaseResponse
import com.quyunshuo.module.home.room.dao.ConcentrationDao
import com.quyunshuo.module.home.room.database.SumDataBase
import kotlinx.coroutines.async
import kotlinx.coroutines.coroutineScope
import javax.inject.Inject

/**
 * 首页M层
 *
 * @author Qu Yunshuo
 * @since 5/25/21 5:42 PM
 */
class StatRepository @Inject constructor() : BaseRepository() {

    private val concentrationDao by lazy {
        SumDataBase.getInstance().concentrationDao()
    }

    /*
        1. 获取天数、获取分钟数、获取次数
     coroutineScope
    创建一个新的协程作用域
    保证内部所有子协程完成前不会退出
    如果任意子协程失败，会取消其他子协程并抛出异常

    async 函数：
    启动一个新的子协程（后台执行）
    返回一个 Deferred<T> 对象（类似 Future，可在之后获取结果）
    每个查询都在独立的子协程中执行

    await() 方法：
    等待 Deferred 协程执行完成
    返回结果值（或抛出异常）
    注意：await 不会阻塞线程，而是挂起协程


     */
    suspend fun getConcentrationStats(): Triple<Int, Int, Int> = coroutineScope {

        // 使用 async 并行执行三个查询
        val focusDays = async { concentrationDao.getTotalFocusDays2() }
        val totalMinutes = async { concentrationDao.getTotalMinutes() }
        val recordsCount = async { concentrationDao.getAll().size }

        // 等待所有结果并返回三元组
        Triple(focusDays.await(), totalMinutes.await(), recordsCount.await())
    }

    suspend fun getWeeklyDetails(startDate: String, endDate: String)=concentrationDao.getWeeklyDetails(startDate,endDate)
}